package cn.zjitc.exam.config;

import cn.zjitc.exam.util.DruidUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement // 启用 Spring 声明式事务
@MapperScan("cn.zjitc.exam.mapper") // 自动扫描 DAO 接口
public class MyBatisConfig {

    @Bean // 注入数据源
    public DataSource dataSource() {
        // 这里可以配置数据源，例如使用 HikariCP、Druid 等
        // 例如：return new HikariDataSource(hikariConfig);
        return DruidUtils.getDataSource(); // 请替换为实际的数据源配置
    }
    /**
     * 配置 SqlSessionFactory，用于创建 MyBatis 会话
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        // 设置 MyBatis 映射文件路径（如 resources/mapper/*.xml）
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/**/*.xml"));

        return sessionFactory.getObject();
    }

    /**
     * 配置事务管理器（可选，用于支持 @Transactional 注解）
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
